/**
* @file			keypad.c
* @author  		Chamalinda Mandawala
* @date    		December 06, 2014
* @brief 			4x4 Matix keypad compatibility module
*/

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_conf.h"
                                      
#include <stm32f0xx.h>

//------------------------------------------------------------------------------
// Function Name : delay_ms
// Description : delay for some time in ms unit(accurate)
// Input : n_ms is how many ms of time to delay
//------------------------------------------------------------------------------
/* Private variables ---------------------------------------------------------*/
static uint32_t msTick =0;
int value;

//void SysTick_Handler()
//{
//	msTick++;
//}

//void delay(uint32_t ms)
//{
//	uint32_t start = msTick;
//	while ((msTick - start) < ms);
//}

//Enable and configure GPIO ports with RCC componenets
void initgpio()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);

//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//GPIO_Init(GPIOC, &GPIO_InitStructure);

// Configure GPIO pin 2 , 12, 7 and 3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_11 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4 ; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; 
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

//void display(int b)
//{
//switch(b)
//{
//case 0: GPIOA->ODR = 0x0007; //0
//GPIOC->ODR = 0x0007;
//delay(1000);
//break;
//case 1:
//GPIOA->ODR = 0x0001; //1
//GPIOC->ODR = 0x0004;
//delay(1000);
//break;
//case 2:
//GPIOA->ODR = 0x000B; //2
//GPIOC->ODR = 0x0003;
//delay(1000);
//break;
//case 3:
//GPIOA->ODR = 0x000B; //3
//GPIOC->ODR = 0x0006;
//delay(1000);
//break;
//case 4: 
//GPIOA->ODR = 0x000D; //4
//GPIOC->ODR = 0x0004;
//delay(1000);
//break;
//case 5:
//GPIOA->ODR = 0x000E; //5
//GPIOC->ODR = 0x0006;
//delay(1000);
//break;
//case 6:
//GPIOA->ODR = 0x000E; //6
//GPIOC->ODR = 0x0007;
//delay(1000);
//break;
//case 7: 
//GPIOA->ODR = 0x0003; //7
//GPIOC->ODR = 0x0004;
//delay(1000);
//break;
//case 8:
//GPIOA->ODR = 0x000F; //8
//GPIOC->ODR = 0x0007;
//delay(1000);
//break;
//case 9:
//GPIOA->ODR = 0x000F; //9
//GPIOC->ODR = 0x0006;
//delay(1000); 
//break;
//case 10:
//GPIOA->ODR = 0x000F; //*
//GPIOC->ODR = 0x0000;
//delay(1000);
//break;
//case 11:
//GPIOA->ODR = 0x0008; //#
//GPIOC->ODR = 0x000F;
//delay(1000);
//break;
//}
//return ;
//}


//Implementation of keypadwrite()
int keypadwrite(void)

{ 
value = 11;

 
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3))//read input bit PB12
value=1;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2)) //read input bit PB11
value=2;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12)) //read input bit PB10
value=3;
//if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)) //read input bit PB2
//value=11;
 
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)) 
value=4;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2))
value=5;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
value=6;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3))
value=7;

if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2))
value=8;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12))
value=9;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3))
value=0;
//if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2))
//value=10;
                    
return value;                         

}                 

